package br.ufrn.dca.controle;

/**
 * Implementa controlador para sistema de segunda ordem utilizando o método do lugar das raizes
 *
 * @author allan
 */
public class LR {

    /**
     * Ponto de ramificação
     */
    private double r1;
    /**
     * Ponto de ramificação
     */
    private double r2;
    /**
     * Kp barrado
     */
    private double kpb;
    /**
     * ganho proporcional
     */
    private double kp;
    /**
     * ganho integral
     */
    private double ki;
    /**
     * ganho derivativo
     */
    private double kd;

    /**
     * Calcula os ganhos do controlador para um sistema de segunda ordem
     *
     * @param tao constante de tempo da planta
     * @param L tempo de atraso
     * @param Kc ganho estatico
     */
    public void PID(double tao, double L, double Kc) {
        r1 = (4 / L) + Math.sqrt((16 / (L * L)) + (16 / L));
        r2 = (4 / L) - Math.sqrt(16 + (16 / (L * L) + (16 / L)));

        if (r1 < 0) {
            kpb = 2 * r1 + (2 / L);
        } else {
            kpb = 2 * r2 + (2 / L);
        }

        double td = tao / 2;
        double ti = 2*tao;
        
        kp = (2*tao*kpb)/Kc;        
        
        
        ki = 1/ti;
        kd = kp;
    }

    public void p_imc(double tao, double k, double L) {
        double TI = Math.min(tao, 8 * L);
        double kc = (1 / (2 * L)) * (1 / (k / tao));
        double TD = tao;

        double f = 1 + TD / TI;
        kp = kc;
        ki = 1 / (TI * f);
        kd = TD / f;
    }

    /**
     * Calcula os ganhos do controlador para um sistema de primeira ordem
     *
     * @param tao constante de tempo da planta
     * @param L tempo de atraso
     * @param C ganho estatico
     */
    public void primeiraOrdem(double tao, double L, double C) {
        double td = (tao * L) / (2 * tao + L);
        double ti = (tao * L) / (2 * td);

        kp = 1;
        ki = 1 / ti;
        kd = td;

    }

    public double getR1() {
        return r1;
    }

    public void setR1(double r1) {
        this.r1 = r1;
    }

    public double getR2() {
        return r2;
    }

    public void setR2(double r2) {
        this.r2 = r2;
    }

    public double getKc() {
        return kpb;
    }

    public void setKc(double kc) {
        this.kpb = kc;
    }

    public double getKp() {
        return kp;
    }

    public void setKp(double kp) {
        this.kp = kp;
    }

    public double getKi() {
        return ki;
    }

    public void setKi(double ki) {
        this.ki = ki;
    }

    public double getKd() {
        return kd;
    }

    public void setKd(double kd) {
        this.kd = kd;
    }
}
